package jrain.fw.script.operator;

import jrain.fw.script.tools.ELException;
import jrain.fw.script.tools.Logger;

//负操作
public class UnaryMinusOperator extends UnaryOperator {

	public static final UnaryMinusOperator SINGLETON = new UnaryMinusOperator();

	public UnaryMinusOperator() {
	}

	public String getOperatorSymbol() {
		return "-";
	}

	public Object apply(Object pValue, Object pContext, Logger pLogger) throws ELException {
		if (pValue == null) {
			/*
			 * if (pLogger.isLoggingWarning ()) { pLogger.logWarning (Constants.ARITH_OP_NULL, getOperatorSymbol ()); }
			 */
			return PrimitiveObjects.getInteger(0);
		} else if (pValue instanceof String) {
			if (Coercions.isFloatingPointString(pValue)) {
				double dval = ((Number) (Coercions.coerceToPrimitiveNumber(pValue, Double.class, pLogger))).doubleValue();
				return PrimitiveObjects.getDouble(-dval);
			} else {
				long lval = ((Number) (Coercions.coerceToPrimitiveNumber(pValue, Long.class, pLogger))).longValue();
				return PrimitiveObjects.getLong(-lval);
			}
		} else if (pValue instanceof Byte) {
			return PrimitiveObjects.getByte((byte) -(((Byte) pValue).byteValue()));
		} else if (pValue instanceof Short) {
			return PrimitiveObjects.getShort((short) -(((Short) pValue).shortValue()));
		} else if (pValue instanceof Integer) {
			return PrimitiveObjects.getInteger((int) -(((Integer) pValue).intValue()));
		} else if (pValue instanceof Long) {
			return PrimitiveObjects.getLong((long) -(((Long) pValue).longValue()));
		} else if (pValue instanceof Float) {
			return PrimitiveObjects.getFloat((float) -(((Float) pValue).floatValue()));
		} else if (pValue instanceof Double) {
			return PrimitiveObjects.getDouble((double) -(((Double) pValue).doubleValue()));
		} else {
			if (pLogger.isLoggingError()) {
				pLogger.logError(Constants.UNARY_OP_BAD_TYPE, getOperatorSymbol(), pValue.getClass().getName());
			}
			return PrimitiveObjects.getInteger(0);
		}
	}

	// -------------------------------------
}
